/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.istia.gesstages.dao.db;

import fr.istia.gesstages.dao.IDaoUser;
import fr.istia.gesstages.exception.PortailException;
import fr.istia.gesstages.jpa.User;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;

/**
 * @date 22/11/2011
 * @author Cédric Moreau
 */
@Transactional
public class DaoUserDB implements IDaoUser {

    @PersistenceContext
    private EntityManager em;

    public User create(User user) {
        try {
            em.persist(user);
            return user;
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la persistance de l'utilisateur '" + user.getLogin() + "'", e);
        }
    }

    public User update(User user) {
        try {
            return em.merge(user);
        } catch (Exception e) {
            throw new UnsupportedOperationException(" Erreur lors de la modification");
        }
    }

    public void delete(User user) {
        try {
            em.remove(em.merge(user));
        } catch (Exception e) {
            throw new UnsupportedOperationException(" Erreur lors de la suppression de l'utilisateur");
        }
    }

    public User find(int id) {
        try {
            return em.find((User.class), id);
        } catch (Exception e) {
            throw new UnsupportedOperationException("Erreur lors de la recherche");
        }
    }

    public User find(String login) {
        try {
            return (User) em.createQuery("SELECT u FROM User u WHERE u.login = :login").setParameter("login", login).getSingleResult();
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la récupération de l'utilisateur '" + login + "'", e);
        }
    }

    public List<User> findAll() {
        try {
            return em.createQuery("SELECT u FROM User u").getResultList();
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la récupération de tous les utilisateurs", e);
        }
    }

    public List<User> findArchived(String year) {
        try {
            return em.createQuery("select e from User e where e.archive = 1").getResultList();
        } catch (Exception e) {
            throw new UnsupportedOperationException(" Erreur lors de la recuperation des offres archivees");
        }
    }

    public void archiveAll() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deleteAll() {
        try {
            em.createQuery("DELETE FROM User u").executeUpdate();
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la suppression de tous les utilisateurs");
        }
    }
}
